{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 一.利用回归树实现分类\n",
    "\n",
    "分类也可以用回归树来做，简单说来就是训练与类别数相同的几组回归树，每一组代表一个类别，然后对所有组的输出进行softmax操作将其转换为概率分布，然后再通过交叉熵或者KL一类的损失函数求每颗树相应的负梯度，指导下一轮的训练，以三分类为例，流程如下：   \n",
    "\n",
    "![avatar](./source/10_梯度提升分类树.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 二.softmax+交叉熵损失，及其梯度求解\n",
    "\n",
    "分类问题，一般会选择用交叉熵作为损失函数，下面对softmax+交叉熵损失函数的梯度做推导：  \n",
    "\n",
    "\n",
    "\n",
    "softmax函数在最大熵那一节已有使用，再回顾一下：   \n",
    "\n",
    "$$\n",
    "softmax([y_1^{hat},y_2^{hat},...,y_n^{hat}])=\\frac{1}{\\sum_{i=1}^n e^{y_i^{hat}}}[e^{y_1^{hat}},e^{y_2^{hat}},...,e^{y_n^{hat}}]\n",
    "$$   \n",
    "\n",
    "交叉熵在logistic回归有介绍：   \n",
    "\n",
    "$$\n",
    "cross\\_entropy(y,p)=-\\sum_{i=1}^n y_ilog p_i\n",
    "$$  \n",
    "\n",
    "将$p_i$替换为$\\frac{e^{y_i^{hat}}}{\\sum_{i=1}^n e^{y_i^{hat}}}$即是我们的损失函数：   \n",
    "\n",
    "$$\n",
    "L(y^{hat},y)=-\\sum_{i=1}^n y_ilog \\frac{e^{y_i^{hat}}}{\\sum_{j=1}^n e^{x_j^{hat}}}\\\\\n",
    "=-\\sum_{i=1}^n y_i(y_i^{hat}-log\\sum_{j=1}^n e^{y_j^{hat}})\\\\\n",
    "=log\\sum_{i=1}^n e^{y_i^{hat}}-\\sum_{i=1}^ny_iy_i^{hat}（由于是onehot展开，所以\\sum_{i=1}^n y_i=1）\n",
    "$$  \n",
    "\n",
    "计算梯度：  \n",
    "\n",
    "$$\n",
    "\\frac{\\partial L(y^{hat},y)}{\\partial y^{hat}}=softmax([y_1^{hat},y_2^{hat},...,y_n^{hat}])-[y_1,y_2,...,y_n]\n",
    "$$  \n",
    "\n",
    "所以，第一组回归树的拟合目标为$y_1-\\frac{e^{y_1^{hat}}}{\\sum_{i=1}^n e^{y_i^{hat}}}$，第二组回归树学习的拟合目标为$y_2-\\frac{e^{y_2^{hat}}}{\\sum_{i=1}^n e^{y_i^{hat}}}$，....，第$n$组回归树的拟合目标为$y_n-\\frac{e^{y_n^{hat}}}{\\sum_{i=1}^n e^{y_i^{hat}}}$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 三.代码实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "os.chdir('../')\n",
    "from ml_models.tree import CARTRegressor\n",
    "from ml_models import utils\n",
    "import copy\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "class GradientBoostingClassifier(object):\n",
    "    def __init__(self, base_estimator=None, n_estimators=10, learning_rate=1.0):\n",
    "        \"\"\"\n",
    "        :param base_estimator: 基学习器，允许异质；异质的情况下使用列表传入比如[estimator1,estimator2,...,estimator10],这时n_estimators会失效；\n",
    "                                同质的情况，单个estimator会被copy成n_estimators份\n",
    "        :param n_estimators: 基学习器迭代数量\n",
    "        :param learning_rate: 学习率，降低后续基学习器的权重，避免过拟合\n",
    "        \"\"\"\n",
    "        self.base_estimator = base_estimator\n",
    "        self.n_estimators = n_estimators\n",
    "        self.learning_rate = learning_rate\n",
    "        if self.base_estimator is None:\n",
    "            # 默认使用决策树桩\n",
    "            self.base_estimator = CARTRegressor(max_depth=2)\n",
    "        # 同质分类器\n",
    "        if type(base_estimator) != list:\n",
    "            estimator = self.base_estimator\n",
    "            self.base_estimator = [copy.deepcopy(estimator) for _ in range(0, self.n_estimators)]\n",
    "        # 异质分类器\n",
    "        else:\n",
    "            self.n_estimators = len(self.base_estimator)\n",
    "\n",
    "        # 扩展class_num组分类器\n",
    "        self.expand_base_estimators = []\n",
    "\n",
    "    def fit(self, x, y):\n",
    "        # 将y转one-hot编码\n",
    "        class_num = np.amax(y) + 1\n",
    "        y_cate = np.zeros(shape=(len(y), class_num))\n",
    "        y_cate[np.arange(len(y)), y] = 1\n",
    "\n",
    "        # 扩展分类器\n",
    "        self.expand_base_estimators = [copy.deepcopy(self.base_estimator) for _ in range(class_num)]\n",
    "\n",
    "        # 拟合第一个模型\n",
    "        y_pred_score_ = []\n",
    "        # TODO:并行优化\n",
    "        for class_index in range(0, class_num):\n",
    "            self.expand_base_estimators[class_index][0].fit(x, y_cate[:, class_index])\n",
    "            y_pred_score_.append(self.expand_base_estimators[class_index][0].predict(x))\n",
    "        y_pred_score_ = np.c_[y_pred_score_].T\n",
    "        # 计算负梯度\n",
    "        new_y = y_cate - utils.softmax(y_pred_score_)\n",
    "        # 训练后续模型\n",
    "        for index in range(1, self.n_estimators):\n",
    "            y_pred_score = []\n",
    "            for class_index in range(0, class_num):\n",
    "                self.expand_base_estimators[class_index][index].fit(x, new_y[:, class_index])\n",
    "                y_pred_score.append(self.expand_base_estimators[class_index][index].predict(x))\n",
    "            y_pred_score_ += np.c_[y_pred_score].T * self.learning_rate\n",
    "            new_y = y_cate - utils.softmax(y_pred_score_)\n",
    "\n",
    "    def predict_proba(self, x):\n",
    "        # TODO:并行优化\n",
    "        y_pred_score = []\n",
    "        for class_index in range(0, len(self.expand_base_estimators)):\n",
    "            estimator_of_index = self.expand_base_estimators[class_index]\n",
    "            y_pred_score.append(\n",
    "                np.sum(\n",
    "                    [estimator_of_index[0].predict(x)] +\n",
    "                    [self.learning_rate * estimator_of_index[i].predict(x) for i in\n",
    "                     range(1, self.n_estimators - 1)] +\n",
    "                    [estimator_of_index[self.n_estimators - 1].predict(x)]\n",
    "                    , axis=0)\n",
    "            )\n",
    "        return utils.softmax(np.c_[y_pred_score].T)\n",
    "\n",
    "    def predict(self, x):\n",
    "        return np.argmax(self.predict_proba(x), axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "#造伪数据\n",
    "from sklearn.datasets import make_classification\n",
    "data, target = make_classification(n_samples=100, n_features=2, n_classes=2, n_informative=1, n_redundant=0,\n",
    "                                   n_repeated=0, n_clusters_per_class=1, class_sep=.5,random_state=21)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x264a0e232e8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 同质\n",
    "classifier = GradientBoostingClassifier(base_estimator=CARTRegressor(),n_estimators=10)\n",
    "classifier.fit(data, target)\n",
    "utils.plot_decision_function(data, target, classifier)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x264a0e23240>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#异质\n",
    "from ml_models.linear_model import LinearRegression\n",
    "classifier = GradientBoostingClassifier(base_estimator=[LinearRegression(),LinearRegression(),LinearRegression(),CARTRegressor(max_depth=2)])\n",
    "classifier.fit(data, target)\n",
    "utils.plot_decision_function(data, target, classifier)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
